iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Software Development

C++ 三十天學習紀錄系列 第 21

【Day 21】Algorithm - Find Cycle in Directed Graph

  • 分享至 

  • xImage
  •  

這題真的需要花一點功夫,題目並不難懂,但是不能用直觀的方式去寫,可以上網搜尋關鍵字「find cycle in directed graph」,以及前一篇所提到的「depth-first search」(DFS)。

題目

輸入輸出格式

Sol.
我採用的作法會先將題目給的資訊整理成陣列:

  1. 依題目建 adjacency matrix
  2. 建一個陣列(selectArray)存哪些點需要判斷是否有迴圈 (若題目給定1、2、3、4,點1、2、4有迴圈也算是有迴圈)
  3. 建三個陣列,分別是whiteSetgraySetblackSet
    whiteSet:還沒判斷過的點
    graySet:正在判斷或已判斷的點
    blackSet:不用再判斷的點,有可能是因為沒有與其連接的點,或其所連接的點不屬於需要判斷的點
    各 set 的長度皆為輸入測資第一行中 node 的數量,以 0 表示此點不在這個 set 中,反之,1 表示此點在這個 set。因此,同一個點指有可能在任一個 set 中表示 1,因為不會同時並存於兩個或以上的 set。
    這個方法大家可以參考Tushar Roy的 Detect Cycle in Directed Graph Algorithm
  4. pathArray,長度為總 node 數量,並將陣列中各項初始化為 -1,存目前已經過的點

Pseudocode

建 adjacencyMatrix、selectArray
建 whiteSet、graySet、blackSet
若是沒有要判斷是否有迴圈的點就先放入blackSet,其餘在whiteSet中皆表示1
建 pathArray

int path = 0;	// 接下來這個點要放在 pathArray 中的哪
bool cycle = false;	// 是否有迴圈
bool neighbor = false;	// 有沒有與之連接的點
int i = 0;	// 現在判斷到第幾個點

//	開始判斷
While (cycle == false或i>= pointQ)
	
	如果根本就不夠判斷是否有迴圈就直接 break
	
	// 判斷這個點有沒有在blackSet中
    bool blackFlag = true;
    if遍歷完blackFlag還是true代表不用再判斷,這時就break
	
	// 不用判斷這個點就跳過繼續判斷下一個點
	if (blackSet[i] == 1)
		i++ 並continue
	
	// 如果這個點可以拿來判斷
	if (whiteSet[i] == 1 && graySet[i] == 0)
		whiteSet[i] = 0;
		graySet[i] = 1;
		pathArray[path] = i;
		path++;
	
	// 找有沒有與之相鄰的 (這個方法真的太聰明..一定要好好學起來)
	for u in range 0~nodes總數
		neighbor = false;
		// 把所有沒有neighbor的情形都判斷完後neighbor 就會是true
		neighbor = true;
		if 第u個點是在whiteSet中
			whiteSet[u] = 0;
			graySet[u] = 1;
			pathArray[path] = u;
			path++;
			i = u;
		else if 第u個點是在graySet中
			cycle = true;
		break;
	
	// 若沒有點與之相鄰了就代表這個點沒用了,把他放到 blackSet
	if neighbor == false
		whiteSet[i]、graySet[i] = 0
		blackSet[i] = 1
		//	在pathArray中刪除這格
		path--;
		pathArray[path] = -1;
		
		讓 i 回到pathArray中最後一個不為 -1 的點
	
最後輸出cycle

上一篇
【Day 20】Algorithm - Practice 2
下一篇
【DAY 22】Algorithm - Insertion sort 插入排序法
系列文
C++ 三十天學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言